package me.mononin.factory.data.message;

import android.support.annotation.NonNull;

import com.raizlabs.android.dbflow.sql.language.OperatorGroup;
import com.raizlabs.android.dbflow.sql.language.SQLite;
import com.raizlabs.android.dbflow.structure.database.transaction.QueryTransaction;

import java.util.Collections;
import java.util.List;

import me.mononin.common.factory.data.DataSource;
import me.mononin.common.utils.CollectionUtil;
import me.mononin.factory.data.BaseDbRepository;
import me.mononin.factory.model.db.Message;
import me.mononin.factory.model.db.Message_Table;

/**
 * 跟某人的聊天列表
 * 聊天交互是双方的，要么我发送给他，要么他发送给我
 */
public class MessageRepository extends BaseDbRepository<Message>
        implements MessageDataSource {

    //聊天对象Id
    private String receiverId;

    public MessageRepository(String receiverId) {
        super();
        this.receiverId = receiverId;
    }

    @Override
    public void load(SucceedCallback<List<Message>> callback) {
        super.load(callback);

        //加载本地消息数据，判断条件还是一下两个：
        // 1：发送者是他，且他不是发送给群组的，而是发送给我的
        // 2：接收者不为空，且接受这是他，发送这是我
        SQLite.select()
                .from(Message.class)
                .where(OperatorGroup.clause()
                        .and(Message_Table.sender_id.eq(receiverId))
                        .and(Message_Table.group_id.isNull()))
                .or(Message_Table.receiver_id.eq(receiverId))
                .orderBy(Message_Table.createAt, false)
                .limit(30)
                .async()
                .queryListResultCallback(this)
                .execute();
    }

    @Override
    public void dispose() {

    }

    @Override
    protected boolean isRequired(Message message) {
        //在此筛选是否是我需要的信息的两个条件是：
        // 1：发送者是他，且他不是发送给群组的，而是发送给我的
        // 2：接收者不为空，且接受这是他，发送这是我
        return (receiverId.equalsIgnoreCase(message.getSender().getId())
                && message.getGroup() == null)
                || message.getReceiver() != null
                && receiverId.equalsIgnoreCase(message.getReceiver().getId());
    }

    @Override
    public void onListQueryResult(QueryTransaction transaction, @NonNull List<Message> tResult) {

        //反转返回的数据
        Collections.reverse(tResult);
        //然后进行调度
        super.onListQueryResult(transaction, tResult);
    }
}
